package com.hzw.saas.api.old.storage;

import com.hzw.saas.api.old.storage.bo.InxChunkBO;
import com.hzw.saas.api.old.storage.bo.ResourceFileBO;
import com.hzw.saas.common.util.enums.ConflictModeEnum;

/**
 * 索引型分片存储服务
 *
 * @author zzl
 * @since 03/12/2021
 */
public interface InxChunkService {

    /**
     * 获取分片信息
     *
     * @param catalog     分片虚拟目录
     * @param fileId      文件ID
     * @param totalChunks 总分片数量
     * @param chunkNumber 分片编号
     * @return 分片信息
     */
    InxChunkBO getChunk(String catalog, String fileId, long totalChunks, long chunkNumber);

    /**
     * 检查分片是否存在
     *
     * @param catalog   分片虚拟目录
     * @param chunkInfo 分片信息
     * @return true-存在/false-不存在
     */
    boolean existChunk(String catalog, InxChunkBO chunkInfo);

    /**
     * 写入分片操作元数据
     *
     * @param catalog  分片虚拟目录
     * @param fileInfo 文件信息
     */
    void writeChunkMetadata(String catalog, ResourceFileBO fileInfo);

    /**
     * 保存分片
     *
     * @param catalog   分片虚拟目录
     * @param chunkInfo 分片信息
     * @param data      分片数据
     * @return
     */
    InxChunkBO saveChunk(String catalog, InxChunkBO chunkInfo, byte[] data);

    /**
     * 删除分片
     *
     * @param catalog     分片虚拟目录
     * @param fileId      文件ID
     * @param chunkNumber 分片编号
     */
    void deleteChunk(String catalog, String fileId, long chunkNumber);

    /**
     * 删除文件的所有分片
     *
     * @param catalog 分片虚拟目录
     * @param fileId  文件ID
     */
    void deleteChunks(String catalog, String fileId);

    /**
     * 合并文件分片
     *
     * @param fileInfo
     * @param chunkCatalog
     * @param mode
     */
    void mergeChunks(ResourceFileBO fileInfo, String chunkCatalog, ConflictModeEnum mode);

}
